#include "../inc/directoryOperation.h"
#include "../inc/main.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>

/*
 * @brief change当前工作目录到path
 * @return 0 表示执行成功，失败返回-1
 */
int changeDirectory(const char* path) {
    chdir(path);
    return 0;
}

static char *getFileMessage(const char *fileName, int maxNameLength) {
	static char fileMessage[150];
	struct stat fileStatus;
	stat(fileName, &fileStatus);
	sprintf(fileMessage, "%s %-*s %ld", S_ISDIR(fileStatus.st_mode) ? "f" : "d", maxNameLength,
		fileName, fileStatus.st_size);
	printf("%s mode 0x%X\n", fileName, fileStatus.st_mode);
	return fileMessage;
}

/*
 * @brief 打印当前目录下的文件
 * @return 0表示执行成功，失败则返回-1
 */
int listFile(const char *path, char *message, int length) {
	DIR *pdir = opendir( path );
	// 用来暂时存储要显示的目录下的所有文件名,最大可以支持200个文件,每个文件长度为30
	char fileNames[200][30];
	int file_Num = 0;
 
	if (NULL == pdir) {
		// 直接显示该文件
		printf("%s not a dir!\n", path);
		return -1;
	} 
    else {
		// 循环检查下面有多少文件,并把文件名全部放到fileNames数组里
		struct dirent *pdirent;
		while ((pdirent = readdir(pdir)) != NULL) {
			char fname[20];
			strcpy(fname, pdirent->d_name);	
			if (fname[0] != '.') {
				strcpy(fileNames[file_Num], pdirent->d_name);
				file_Num++;
			}
		}
		closedir( pdir );
	}
 
	// 文件名排序
	int i, j;
	char temp[110];
	for(i = 0; i < file_Num; ++ i) {
		for(j = i+1; j < file_Num; ++ j) {
			if(strcmp(fileNames[i], fileNames[j]) > 0) {
				strcpy(temp, fileNames[i]);
				strcpy(fileNames[i], fileNames[j]);
				strcpy(fileNames[j], temp);
			}
		}
	}
 
	// 确定所有文件里面最长的文件名的长度
	int max_len = 0;
	for(i = 0; i < file_Num; ++ i) {
		int len = strlen(fileNames[i]);
		if(len > max_len) {
			max_len = len;
		}
	}
 
    // 打印文件
    int cnt = 0;
	for(i = 0; i < file_Num; ++ i) {
        cnt += sprintf(message + cnt,"%s\n", getFileMessage(fileNames[i], max_len));
    }
	message[cnt - 1] = 0;
    return 0;
} 

/*
 * @brief 删掉指定文件
 * @return 0 表示执行成功，失败返回-1
 */
int removeFile(const char *fileName) {
    int ret = remove(fileName);
    ERROR_CHECK(ret, -1, "remove");
    return 0;
}

/*
 * @brief 打印当前目录路径
 * @return 0表示执行正确，失败则返回NULL
 */
int printWorkingDirectory(char *message, int length) {
    char *ret = getcwd(NULL, length);
    strcpy (message, ret);
    //ERROR_CHECK (ret, NULL, "getcwd");
    return 0;
}

/*
 * @brief 创建文件并赋予实际权限0775
 * @return 0表示执行成功，失败则返回-1
 */
int makeDirectory(const char *path) {
    int ret = mkdir(path, 0777);
    ERROR_CHECK(ret, -1, "mkdir");
    return 0;
}
